package cn.com.infohold.smartcity.utils;


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSyntaxException;

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Gson帮助类
 *
 * @author zyh
 */
public class GsonUtil {
    /**
     * 用于显示日期时间的格式化对象
     */
    public static SimpleDateFormat TIMESTAMP_FMT = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");

    /**
     * Gson
     */
    public static final Gson GSON = createGson();

    /**
     * 用于Gson中反序列化时间类型
     *
     * @author YuLeyuan
     */
    static class DateDeserializer implements JsonDeserializer<Date> {
        /**
         * 反序列化
         */
        @Override
        public Date deserialize(JsonElement json, Type type,
                                JsonDeserializationContext context) throws JsonParseException {
            if (json instanceof JsonPrimitive) {
                String s = json.getAsJsonPrimitive().getAsString();
                if (s == null || s.equals("")) {
                    return null;
                } else {
                    try {
                        return TIMESTAMP_FMT.parse(s);
                    } catch (ParseException e) {
                        throw new IllegalArgumentException("时间格式有误，无法解析", e);
                    }
                }
            } else {
                return null;
            }
        }

    }

    /**
     * 创建gson对象
     *
     * @return
     */
    public static Gson createGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss");
        DateDeserializer ds = new DateDeserializer();
        gsonBuilder.registerTypeAdapter(Date.class, ds);
        return gsonBuilder.create();
    }

    /**
     * 将对象转换为json串
     *
     * @param src 待转换对象
     * @return
     */
    public static String toJson(Object src) {
        return GSON.toJson(src);
    }

    /**
     * 将对象转换为json串
     *
     * @param src       待转换对象
     * @param typeOfSrc 对象的type类型
     * @return
     */
    public static String toJson(Object src, Type typeOfSrc) {
        return GSON.toJson(src, typeOfSrc);
    }

    /**
     * 将json串转换为对象
     *
     * @param json     待转换json串
     * @param classOfT 对象的class类型
     * @param <T>      T
     * @return
     * @throws JsonSyntaxException
     */
    public static <T> T fromJson(String json, Class<T> classOfT)
            throws JsonSyntaxException {
        return GSON.fromJson(json, classOfT);
    }

    /**
     * 将json串转换为对象
     *
     * @param json     待转换的jsonelement
     * @param classOfT 对象的class类型
     * @param <T>      T
     * @return
     * @throws JsonSyntaxException
     */
    public static <T> T fromJson(JsonElement json, Class<T> classOfT)
            throws JsonSyntaxException {
        return GSON.fromJson(json, classOfT);
    }

    /**
     * 将json穿转换为对象
     *
     * @param json    待转换json串
     * @param typeOfT 对象的type类型
     * @param <T>     T
     * @return
     * @throws JsonSyntaxException
     */
    public static <T> T fromJson(String json, Type typeOfT)
            throws JsonSyntaxException {
        return GSON.fromJson(json, typeOfT);
    }

    /**
     * 将JsonElement转化为对象
     *
     * @param json    待转换的JsonElement
     * @param typeOfT 对象的class类型
     * @param <T>     T
     * @return
     * @throws JsonSyntaxException
     */
    public static <T> T fromJson(JsonElement json, Type typeOfT)
            throws JsonSyntaxException {
        return GSON.fromJson(json, typeOfT);
    }

}
